package base_init

import (
	"github.com/gin-gonic/gin/binding"
	"github.com/go-playground/locales/en" // 英文语言包
	"github.com/go-playground/locales/zh" // 中文语言包
	ut "github.com/go-playground/universal-translator"
	"github.com/go-playground/validator/v10"
	enTranslation "github.com/go-playground/validator/v10/translations/en"  // 英文翻译
	zhTranslations "github.com/go-playground/validator/v10/translations/zh" // 中文翻译
	"go-likaladi-shop/common/base_global"
	"go.uber.org/zap" // 日志库
	"reflect"         // 反射，用于解析结构体字段
	"strings"         // 字符串处理
)

// Trans 初始化表单验证的翻译器
// locale: 语言环境（支持 "en" 英文 和 "zh" 中文）
func Trans(locale string) {
	// 1. 获取 Gin 框架的默认验证器，并确保它是 validator.Validate 类型
	if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
		// 2. 注册一个 Tag 解析函数，获取 JSON 标签的字段名
		//    这样可以确保错误信息使用 JSON 字段名，而不是结构体字段名
		v.RegisterTagNameFunc(func(fld reflect.StructField) string {
			// 获取 `json` 标签的值，字段格式如 `json:"name,omitempty"`
			name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
			// 如果 JSON 标签是 `-`，表示该字段不应该被解析，直接返回空字符串
			if name == "-" {
				return ""
			}
			return name
		})

		//注册相应的翻译规则
		registerValidate(v, ok, locale)

		zap.S().Infof("注册参数校验规则")
	}
}

func registerValidate(v *validator.Validate, ok bool, locale string) {
	// 3. 创建中英文翻译器
	zhT := zh.New()              // 中文翻译器
	enT := en.New()              // 英文翻译器
	uni := ut.New(enT, zhT, enT) // 创建通用翻译器，默认英文

	// 4. 获取指定语言的翻译器
	base_global.Trans, ok = uni.GetTranslator(locale)
	if !ok {
		//zap.S().Errorf("初始化翻译错误: uni.GetTranslator(%s)", locale)
		//panic("初始化翻译错误")

		//zap.S().Fatalf()（会直接 os.Exit(1)，直接退出, 适合初始化）
		zap.S().Fatalf("初始化翻译错误: uni.GetTranslator(%s): ", locale)
	}

	// 5. 根据传入的语言参数，注册相应的翻译规则
	switch locale {
	case "en": // 英文翻译
		if err := enTranslation.RegisterDefaultTranslations(v, base_global.Trans); err != nil {
			//zap.S().Errorw("en.RegisterDefaultTranslations错误", "msg", err.Error())
			//panic("en初始化翻译错误")

			//zap.S().Fatalf()（会直接 os.Exit(1)，直接退出, 适合初始化）
			zap.S().Fatalf("en.RegisterDefaultTranslations错误: %v", err)
		}
	case "zh": // 中文翻译
		if err := zhTranslations.RegisterDefaultTranslations(v, base_global.Trans); err != nil {
			//zap.S().Errorw("zh.RegisterDefaultTranslations错误", "msg", err.Error())
			//panic("zh初始化翻译错误")

			//zap.S().Fatalf()（会直接 os.Exit(1)，直接退出, 适合初始化）
			zap.S().Fatalf("zh.RegisterDefaultTranslations错误: %v", err)
		}
	default: // 默认使用英文翻译
		if err := enTranslation.RegisterDefaultTranslations(v, base_global.Trans); err != nil {
			//zap.S().Errorw("default=>en.RegisterDefaultTranslations错误", "msg", err.Error())
			//panic("default初始化翻译错误")

			//zap.S().Fatalf()（会直接 os.Exit(1)，直接退出, 适合初始化）
			zap.S().Fatalf("default=>en.RegisterDefaultTranslations错误: %v", err)
		}
	}
}
